"""Flask Web应用主文件

配置和创建Flask应用实例。
"""

import os
import logging
from flask import Flask, render_template, request, jsonify
from flask_cors import CORS
from werkzeug.exceptions import HTTPException

def create_app(config=None):
    """创建Flask应用实例
    
    Args:
        config: 配置对象或配置名称
        
    Returns:
        Flask应用实例
    """
    # 获取当前文件所在目录
    current_dir = os.path.dirname(os.path.abspath(__file__))
    template_dir = os.path.join(current_dir, 'templates')
    
    app = Flask(__name__, template_folder=template_dir)
    
    # 配置
    app.config.update({
        'SECRET_KEY': os.environ.get('SECRET_KEY', 'survey-analyzer-secret-key'),
        'DEBUG': True,  # 暂时启用调试模式
        'UPLOAD_FOLDER': os.path.join(os.getcwd(), 'uploads'),
        'MAX_CONTENT_LENGTH': 16 * 1024 * 1024,  # 16MB max file size
        'JSON_AS_ASCII': False,  # 支持中文JSON
        'JSONIFY_PRETTYPRINT_REGULAR': True
    })
    
    # 确保上传目录存在
    os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
    
    # 启用CORS
    CORS(app, resources={
        r"/api/*": {
            "origins": "*",
            "methods": ["GET", "POST", "PUT", "DELETE"],
            "allow_headers": ["Content-Type", "Authorization"]
        }
    })
    
    # 配置日志
    if not app.debug:
        logging.basicConfig(
            level=logging.INFO,
            format='%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
        )
    
    # 注册蓝图
    try:
        from .routes import main_bp
        from .api import api_bp
        
        print(f"[DEBUG] 蓝图导入成功: main_bp={main_bp}, api_bp={api_bp}")
        
        app.register_blueprint(main_bp)
        app.register_blueprint(api_bp, url_prefix='/api')
        
        print(f"[DEBUG] 蓝图注册成功")
        print(f"[DEBUG] 应用路由: {[rule.rule for rule in app.url_map.iter_rules()]}")
    except Exception as e:
        print(f"[DEBUG] 蓝图导入或注册失败: {e}")
        import traceback
        traceback.print_exc()
    
    # 添加请求钩子来调试所有请求
    @app.before_request
    def log_request_info():
        print(f"[REQUEST DEBUG] {request.method} {request.url} - Headers: {dict(request.headers)}")
        if request.is_json:
            print(f"[REQUEST DEBUG] JSON Data: {request.get_json()}")
    
    # 错误处理
    @app.errorhandler(404)
    def not_found_error(error):
        return jsonify({'error': '页面不存在'}), 404
    
    @app.errorhandler(500)
    def internal_error(error):
        return jsonify({'error': '服务器内部错误'}), 500
    
    @app.errorhandler(413)
    def too_large(error):
        return jsonify({'error': '文件过大，请上传小于16MB的文件'}), 413
    
    @app.errorhandler(HTTPException)
    def handle_exception(e):
        """处理HTTP异常"""
        return jsonify({
            'error': e.description,
            'code': e.code
        }), e.code
    
    # 健康检查
    @app.route('/health')
    def health_check():
        return jsonify({
            'status': 'healthy',
            'version': '2.0.0',
            'service': 'SurveyAnalyzer'
        })
    
    # 应用信息
    @app.route('/info')
    def app_info():
        return jsonify({
            'name': 'SurveyAnalyzer',
            'version': '2.0.0',
            'description': '智能问卷数据分析系统',
            'features': [
                '数据加载和清洗',
                '统计分析',
                '聚类分析',
                '可视化图表',
                'AI智能分析',
                '异常检测',
                '时间序列分析',
                '降维分析'
            ],
            'api_endpoints': {
                'upload': '/api/upload',
                'analyze': '/api/analyze',
                'visualize': '/api/visualize',
                'cluster': '/api/cluster',
                'ai_analysis': '/api/ai/analyze',
                'anomaly_detection': '/api/anomaly',
                'time_series': '/api/timeseries',
                'dimensionality': '/api/dimensionality',
                'generate_report': '/api/generate_report'
            }
        })
    
    # 生成报告接口
    @app.route('/api/generate_report', methods=['POST'])
    def generate_report():
        try:
            data = request.get_json()
            file_path = data.get('file_path')
            use_ai_insights = data.get('use_ai_insights', False)
            template_id = data.get('template_id', 'comprehensive')  # 新增模板选择
            use_simple_generator = data.get('use_simple_generator', False)  # 新增简化生成器选项
            
            if not file_path:
                return jsonify({'error': '未提供文件路径'}), 400
            
            # 加载数据
            import pandas as pd
            df = pd.read_csv(file_path)
            
            # 如果使用简化生成器
            if use_simple_generator:
                from report_generator import SimpleReportGenerator
                
                simple_generator = SimpleReportGenerator()
                report = simple_generator.generate_simple_report(
                    df, 
                    title=data.get('title', '数据分析报告'),
                    author=data.get('author', '系统生成')
                )
                
                return jsonify({
                    'success': True,
                    'report': report,
                    'generator_type': 'simple',
                    'ai_enhanced': False
                })
            
            # 执行分析
            import sys
            import os
            sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'core'))
            sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'ai'))
            
            from analyzer import SurveyAnalyzer
            analyzer = SurveyAnalyzer()
            analysis_results = analyzer.analyze_data(df)
            
            # 生成报告
            from report_generator import ReportGenerator
            report_generator = ReportGenerator()
            
            # 生成标准报告
            report = report_generator.generate_report(
                df, 
                title=data.get('title', '数据分析报告')
            )
            
            return jsonify({
                'success': True,
                'report': report,
                'generator_type': 'standard',
                'ai_enhanced': use_ai_insights,
                'template_used': template_id
            })
            
        except Exception as e:
            return jsonify({'error': str(e)}), 500
    
    # 获取可用模板列表接口
    @app.route('/api/templates', methods=['GET'])
    def get_templates():
        try:
            return jsonify({
                'success': True,
                'templates': [
                    {'id': 'standard', 'name': '标准报告', 'description': '包含基础统计分析和数据洞察'}
                ]
            })
            
        except Exception as e:
            return jsonify({'error': str(e)}), 500
    
    return app

if __name__ == '__main__':
    app = create_app()
    app.run(host='0.0.0.0', port=5000, debug=True)